import { onMounted, onUnmounted } from "vue";
import { ElMessage } from "element-plus";
import { useFileStore } from "../stores/fileStore";
import { useFileOperations } from "./useFileOperations";

export function useKeyboard(uiState: {
  hideContextMenu: () => void;
  contextMenu: { visible: boolean };
  startRename: (item: any) => void;
  showProperties: () => void;
  renamingItem: any;
}) {
  const fileStore = useFileStore();
  const fileOps = useFileOperations(uiState);

  // 检查是否有文字被选中
  const hasTextSelection = () => {
    const selection = window.getSelection();
    return selection && selection.toString().trim().length > 0;
  };

  const handleGlobalKeyDown = (event: KeyboardEvent) => {
    // 如果正在重命名，不处理全局快捷键
    if (uiState.renamingItem.value) {
      return;
    }

    // 如果焦点在输入框等元素上，不处理
    const target = event.target as HTMLElement;
    if (target.tagName === "INPUT" || target.tagName === "TEXTAREA") {
      return;
    }

    // 检查是否有文字被选中
    const hasSelection = hasTextSelection();

    // Ctrl+C 复制
    if (event.ctrlKey && event.key.toLowerCase() === "c") {
      // 如果有文字选中，让浏览器处理默认的文字复制
      if (hasSelection) {
        return; // 让浏览器处理文字复制
      }

      // 如果有文件选中，执行文件复制
      if (fileStore.selectedItem) {
        event.preventDefault();
        event.stopPropagation();
        fileOps.copyItem();
        return;
      }
    }

    // Ctrl+X 剪切
    if (event.ctrlKey && event.key.toLowerCase() === "x") {
      // 如果有文字选中，让浏览器处理默认的文字剪切
      if (hasSelection) {
        return; // 让浏览器处理文字剪切
      }

      // 如果有文件选中，执行文件剪切
      if (fileStore.selectedItem) {
        event.preventDefault();
        event.stopPropagation();
        fileOps.cutItem();
        return;
      }
    }

    // Ctrl+V 粘贴
    if (event.ctrlKey && event.key.toLowerCase() === "v") {
      // 如果焦点在可编辑元素上，让浏览器处理默认的文字粘贴
      if (target.isContentEditable) {
        return;
      }

      // 如果剪贴板有文件，执行文件粘贴
      if (fileStore.clipboard.item) {
        event.preventDefault();
        event.stopPropagation();
        fileOps.pasteItem();
        return;
      }
    }

    // Delete 删除
    if (event.key === "Delete" && fileStore.selectedItem) {
      event.preventDefault();
      fileOps.deleteItem();
      return;
    }

    // F2 重命名
    if (event.key === "F2" && fileStore.selectedItem) {
      event.preventDefault();
      fileOps.renameItem();
      return;
    }

    // Enter 打开
    if (event.key === "Enter" && fileStore.selectedItem) {
      event.preventDefault();
      fileOps.openItem(fileStore.selectedItem);
      return;
    }

    // Escape 取消选择
    if (event.key === "Escape") {
      event.preventDefault();
      fileStore.clearSelection();
      uiState.hideContextMenu();
      return;
    }

    // Alt+← 后退
    if (event.altKey && event.key === "ArrowLeft") {
      event.preventDefault();
      fileStore.goBack();
      return;
    }

    // Alt+→ 前进
    if (event.altKey && event.key === "ArrowRight") {
      event.preventDefault();
      fileStore.goForward();
      return;
    }

    // Alt+↑ 向上一级
    if (event.altKey && event.key === "ArrowUp") {
      event.preventDefault();
      fileStore.goUp();
      return;
    }

    // Ctrl+R 或 F5 刷新
    if ((event.ctrlKey && event.key === "r") || event.key === "F5") {
      event.preventDefault();
      fileOps.refresh();
      return;
    }

    // Alt+F4 关闭（暂时用消息提示）
    if (event.altKey && event.key === "F4") {
      event.preventDefault();
      ElMessage.info("Alt+F4 关闭应用");
      return;
    }
  };

  // 全局点击事件处理 - 只隐藏菜单，不清除选中项
  const handleGlobalClick = (event: MouseEvent) => {
    if (!uiState.contextMenu.visible) return;

    const target = event.target as HTMLElement;

    // 检查点击的元素是否是 popover 菜单或其子元素
    const isClickOnPopover = target.closest(".context-menu-popover") !== null;

    // 如果不是点击菜单，只隐藏菜单，不清除选中项
    if (!isClickOnPopover) {
      uiState.hideContextMenu();
    }
  };

  // 生命周期管理
  const setupKeyboardListeners = () => {
    document.addEventListener("keydown", handleGlobalKeyDown);
    document.addEventListener("click", handleGlobalClick);
  };

  const cleanupKeyboardListeners = () => {
    document.removeEventListener("keydown", handleGlobalKeyDown);
    document.removeEventListener("click", handleGlobalClick);
  };

  // 在组件中使用时自动设置和清理
  onMounted(() => {
    setupKeyboardListeners();
  });

  onUnmounted(() => {
    cleanupKeyboardListeners();
  });

  return {
    handleGlobalKeyDown,
    handleGlobalClick,
    setupKeyboardListeners,
    cleanupKeyboardListeners,
  };
}
